﻿using Sinacor.Infra.Service.Common;
using Sinacor.Servico.Bovespa.Contabil.BusinessEntity;
using Sinacor.Servico.Bovespa.Cliente;
using System.Collections.Generic;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Servico.Bovespa.Cliente.BusinessLogic;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Contabil.BusinessLogic
{
    public class TipoDespesa : BaseBusinessLogic
    {
		public TipoDespesa(){}

		public void AlterarTipoDespesa(Sinacor.Servico.Bovespa.Contabil.BusinessEntity.TipoDespesa entity)
        {            
            this.ValidarTipoDespesa(entity);
            
            ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
            _resourceAccess.AlterarTipoDespesa(entity);  
        }

		public void AlterarTiposDespesas(List<BusinessEntity.TipoDespesa> entityList)
        {
            foreach(BusinessEntity.TipoDespesa item in entityList)
            {
                this.AlterarTipoDespesa(item);
            }
		}

		public List<BusinessEntity.TipoDespesa> ConsultarTiposDespesas(BusinessEntity.Parameter.FiltroTipoDespesa parameter)
        {
            ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
            return _resourceAccess.ConsultarTiposDespesas(parameter);
		}

		public List<BusinessEntity.TipoDespesa> ConsultarTiposDespesasPeriodo(BusinessEntity.Parameter.FiltroTipoDespesaPeriodo parameter)
        {
            ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
            return _resourceAccess.ConsultarTiposDespesasPeriodo(parameter);
		}

		public void ExcluirTipoDespesa(BusinessEntity.Parameter.FiltroTipoDespesaChave parameter)
        {
            BusinessLogic.DespesaNota _businessLogicDespesaNota = new DespesaNota();
            
            BusinessEntity.Parameter.FiltroDespesaNota _filtro = new Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroDespesaNota();
            _filtro.Codigo = parameter.Codigo;

            List<BusinessEntity.DespesaNota> _listaDespesas = new List<Sinacor.Servico.Bovespa.Contabil.BusinessEntity.DespesaNota>();
            _listaDespesas = _businessLogicDespesaNota.ConsultarDespesasNota(_filtro);

            if (_listaDespesas.Count > 0)
            {
                throw new BusinessException(109221);
            }
            else
            { 
                Cliente.BusinessLogic.Cliente _businessLogicCliente = new Sinacor.Servico.Bovespa.Cliente.BusinessLogic.Cliente();
                Cliente.BusinessEntity.Parameter.FiltroDependenciaTipoDespesa _filtroDependencia = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroDependenciaTipoDespesa();
                Cliente.BusinessEntity.DependenciaTipoDespesa _dependencia = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.DependenciaTipoDespesa();
                _filtroDependencia.Codigo = parameter.Codigo;
                _dependencia = _businessLogicCliente.VerificarDependenciaTipoDespesa(_filtroDependencia);

                if (_dependencia.ExisteDependencia)
                {
                    throw new BusinessException(109222);
                }
                else 
                {
                    ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
                    _resourceAccess.ExcluirTipoDespesa(parameter);
                }
            }
		}

		public void ExcluirTiposDespesas(List<BusinessEntity.Parameter.FiltroTipoDespesaChave> parameterList)
        {
            foreach(Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroTipoDespesaChave item in parameterList)
            {
                this.ExcluirTipoDespesa(item);
            }
		}

		public void IncluirTipoDespesa(BusinessEntity.TipoDespesa entity)
        {
            this.ValidarTipoDespesa(entity);

            BusinessEntity.Parameter.FiltroTipoDespesa _filtro = new Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroTipoDespesa();
            _filtro.Codigo = entity.Codigo;
            
            List<BusinessEntity.TipoDespesa> _lista = new List<Sinacor.Servico.Bovespa.Contabil.BusinessEntity.TipoDespesa>();
            _lista = this.ConsultarTiposDespesas(_filtro);

            if (_lista.Count > 0)
            {
                throw new BusinessException(109220);
            }
            else
            {
                ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
                _resourceAccess.IncluirTipoDespesa(entity);
            }
		}

		public void IncluirTiposDespesas(List<BusinessEntity.TipoDespesa> entityList)
        {
            foreach(BusinessEntity.TipoDespesa item in entityList)
            {
                this.IncluirTipoDespesa(item);
            }

		}

		public BusinessEntity.TipoDespesa ObterTipoDespesa(BusinessEntity.Parameter.FiltroTipoDespesaChave parameter)
        {
            BusinessEntity.Parameter.FiltroTipoDespesa _parameter = new Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroTipoDespesa();
            _parameter.Codigo = parameter.Codigo;

            List<BusinessEntity.TipoDespesa> _lista = new List<Sinacor.Servico.Bovespa.Contabil.BusinessEntity.TipoDespesa>();
            _lista = this.ConsultarTiposDespesas(_parameter);
            if ((_lista != null) && (_lista.Count > 0))
            {
                return _lista[0];
            }
            else
            {
                return null;
            }
		}

		private bool ValidarExistenciaTipoDespesa(BusinessEntity.Parameter.FiltroTipoDespesaChave parameter)
        {
            BusinessEntity.Parameter.FiltroTipoDespesa _filtro = new Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroTipoDespesa();
            _filtro.Codigo = parameter.Codigo;

            List<BusinessEntity.TipoDespesa> _lista = new List<Sinacor.Servico.Bovespa.Contabil.BusinessEntity.TipoDespesa>();
            _lista = this.ConsultarTiposDespesas(_filtro);

            return (_lista.Count > 0);
		}

		private void ValidarTipoDespesa(BusinessEntity.TipoDespesa entity)
        {
            SinacorValidation validation = new SinacorValidation();
            validation.AddValidation<BusinessEntity.TipoDespesa>(entity);
            validation.Validate();
            validation = null;

            BusinessEntity.Parameter.FiltroTipoDespesa _filtro = new Sinacor.Servico.Bovespa.Contabil.BusinessEntity.Parameter.FiltroTipoDespesa();
            _filtro.Descricao = entity.Descricao;

            if (VerificarDuplicidadeDescricao(_filtro))
            {
                throw new BusinessException(109218);
            }
		}

        private bool VerificarDuplicidadeDescricao(BusinessEntity.Parameter.FiltroTipoDespesa parameter)
        {
            ResourceAccess.TipoDespesa _resourceAccess = new Sinacor.Servico.Bovespa.Contabil.ResourceAccess.TipoDespesa();
            return _resourceAccess.VerificarDuplicidadeDescricao(parameter);               
        }
	}
}